package com.mccken.rapid.core.context;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 属性上下文的抽象类，在其内部进行实现
 * 通过一个规定类型key，设置一个规定类型的value
 * 
 * @program: rapid_gateway
 * @description:
 * @author: mccken
 * @create: 2022-01-28 13:20
 **/
public abstract class AttributeKey<T> {

	// namedMap, 想给 AttributeKey 取一个名字
	private static final Map<String, AttributeKey<?>> namedMap = new HashMap<>();
	
	// 到负载均衡之前，要通过具体的服务，获取对应的服务实例列表
	public static final AttributeKey<Set<String>> MATCH_ADDRESS  = create(Set.class);
	
	public static AttributeKey<?> valueOf(String name) {
		return namedMap.get(name);
	}
	
	static {
		namedMap.put("MATCH_ADDRESS", MATCH_ADDRESS);
	}
	
	
	/**
	 * 给我一个对象，转成对应的class类型
	 * 
	 * @param value
	 * @return
	 */
	public abstract T cast(Object value);

	/**
	 * 对外暴露创建AttributeKey
	 * 
	 * @param valueClass 给我的对应的泛型类
	 * @param <T> 
	 * @return AttributeKey -> SimpleAttributeKey
	 */
	public static <T> AttributeKey<T> create(final Class<? super T> valueClass) {
		return new SimpleAttributeKey(valueClass);
	}
	
	public static class SimpleAttributeKey<T> extends AttributeKey<T> {

		public final Class<T> valueClass;

		public SimpleAttributeKey(final Class<T> valueClass) {
			this.valueClass = valueClass;
		}

		@Override
		public T cast(Object value) {
			return null;
		}

		@Override
		public String toString() {
			if (valueClass != null) {
				StringBuilder sb = new StringBuilder(getClass().getName());
				sb.append("<");
				sb.append(valueClass.getName());
				sb.append(">");
				return sb.toString();
			}
			return super.toString();
		}
	}
	
}
